package api

import (
	"strconv"

	"github.com/gin-gonic/gin"

	"BookStack/internal/application/navigation"
	"BookStack/internal/interfaces/middleware"
	"BookStack/internal/interfaces/presenter"
)

// NavigationHandler 导航处理器
type NavigationHandler struct {
	service  navigation.Service
	response presenter.ResponseFormatter
}

// NewNavigationHandler 创建导航处理器
func NewNavigationHandler(service navigation.Service) *NavigationHandler {
	return &NavigationHandler{
		service:  service,
		response: presenter.NewResponseFormatter(),
	}
}

// RegisterRoutes 注册路由
func (h *NavigationHandler) RegisterRoutes(r *gin.RouterGroup) {
	// 公开接口
	public := r.Group("/navigation")
	{
		public.GET("/list", h.List)
		public.GET("", h.GetNavigation)
	}

	// 管理员接口
	admin := r.Group("/admin/navigation")
	admin.Use(middleware.JWTAuth(), middleware.AdminAuth()) // 管理员权限认证中间件
	{
		admin.GET("/list", h.AdminList) // 获取后台导航列表
		admin.POST("", h.CreateNavigation)
		admin.PUT("", h.UpdateNavigation)
		admin.DELETE("", h.DeleteNavigation)
	}
}

// List 获取导航列表
// @Summary 获取导航列表
// @Description 获取指定位置的导航列表，支持分页
// @Tags 导航管理
// @Accept json
// @Produce json
// @Param position query string true "导航位置"
// @Param page query int false "页码，默认1"
// @Param page_size query int false "每页数量，默认10"
// @Success 200 {object} response.Response{data=navigation.NavigationListResponse}
// @Router /api/v1/navigation/list [get]
func (h *NavigationHandler) List(c *gin.Context) {
	// 获取查询参数
	position := c.Query("position")
	if position == "" {
		c.Error(navigation.ValidationError("position", "导航位置不能为空"))
		return
	}

	// 获取分页参数
	page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
	pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10"))

	// 参数校验
	if page <= 0 {
		page = 1
	}
	if pageSize <= 0 {
		pageSize = 10
	}

	// 公开API默认只查询已启用状态的导航
	status := 1 // 启用状态
	result, err := h.service.ListNavigations(c.Request.Context(), position, page, pageSize, &status)
	if err != nil {
		c.Error(err)
		return
	}

	h.response.Success(c, result)
}

// GetNavigation 获取导航详情
// @Summary 获取导航详情
// @Description 获取导航详情
// @Tags 导航管理
// @Accept json
// @Produce json
// @Param id query int true "导航ID"
// @Success 200 {object} response.Response{data=navigation.NavigationResponse} "成功"
// @Failure 400 {object} response.Response "请求错误"
// @Failure 404 {object} response.Response "导航不存在"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Router /api/v1/navigation [get]
func (h *NavigationHandler) GetNavigation(c *gin.Context) {
	// 获取ID参数
	idStr := c.Query("id")
	if idStr == "" {
		c.Error(navigation.ValidationError("id", "导航ID不能为空"))
		return
	}

	id, err := strconv.ParseUint(idStr, 10, 64)
	if err != nil {
		c.Error(navigation.ValidationError("id", "无效的导航ID"))
		return
	}

	// 获取导航详情
	result, err := h.service.GetNavigation(c.Request.Context(), uint(id))
	if err != nil {
		c.Error(err)
		return
	}

	// 公开API只返回启用状态的导航
	if result.Status != 1 {
		c.Error(navigation.ValidationError("status", "导航未启用"))
		return
	}

	h.response.Success(c, result)
}

// CreateNavigation 创建导航
// @Summary 创建导航
// @Description 创建导航
// @Tags 导航管理
// @Accept json
// @Produce json
// @Param navigation body navigation.CreateNavigationRequest true "导航信息"
// @Success 200 {object} response.Response{data=navigation.NavigationResponse} "成功"
// @Failure 400 {object} response.Response "请求错误"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Router /api/v1/admin/navigation [post]
func (h *NavigationHandler) CreateNavigation(c *gin.Context) {
	var req navigation.CreateNavigationRequest

	// 绑定请求参数
	if err := c.ShouldBindJSON(&req); err != nil {
		c.Error(navigation.ValidationError("params", "无效的请求参数: "+err.Error()))
		return
	}

	// 设置默认值
	if req.Target == "" {
		req.Target = "_self"
	}
	if req.Status == 0 {
		req.Status = 1 // 默认激活状态
	}

	// 创建导航
	result, err := h.service.CreateNavigation(c.Request.Context(), &req)
	if err != nil {
		c.Error(err)
		return
	}

	h.response.Success(c, result)
}

// UpdateNavigation 更新导航
// @Summary 更新导航
// @Description 更新导航
// @Tags 导航管理
// @Accept json
// @Produce json
// @Param navigation body navigation.UpdateNavigationRequest true "导航信息"
// @Success 200 {object} response.Response{data=navigation.NavigationResponse} "成功"
// @Failure 400 {object} response.Response "请求错误"
// @Failure 404 {object} response.Response "导航不存在"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Router /api/v1/admin/navigation [put]
func (h *NavigationHandler) UpdateNavigation(c *gin.Context) {
	var req navigation.UpdateNavigationRequest

	// 绑定请求参数
	if err := c.ShouldBindJSON(&req); err != nil {
		c.Error(navigation.ValidationError("params", "无效的请求参数: "+err.Error()))
		return
	}

	// 设置默认值
	if req.Target == "" {
		req.Target = "_self"
	}

	// 更新导航
	result, err := h.service.UpdateNavigation(c.Request.Context(), &req)
	if err != nil {
		c.Error(err)
		return
	}

	h.response.Success(c, result)
}

// DeleteNavigation 删除导航
// @Summary 删除导航
// @Description 删除导航
// @Tags 导航管理
// @Accept json
// @Produce json
// @Param id body int true "导航ID"
// @Success 200 {object} response.Response "成功"
// @Failure 400 {object} response.Response "请求错误"
// @Failure 404 {object} response.Response "导航不存在"
// @Failure 500 {object} response.Response "服务器内部错误"
// @Router /api/v1/admin/navigation [delete]
func (h *NavigationHandler) DeleteNavigation(c *gin.Context) {
	var req struct {
		ID uint `json:"id" binding:"required"`
	}

	// 绑定请求参数
	if err := c.ShouldBindJSON(&req); err != nil {
		c.Error(navigation.ValidationError("params", "无效的请求参数: "+err.Error()))
		return
	}

	// 删除导航
	if err := h.service.DeleteNavigation(c.Request.Context(), req.ID); err != nil {
		c.Error(err)
		return
	}

	h.response.Success(c, nil)
}

// AdminList 获取后台导航列表
// @Summary 获取后台导航列表
// @Description 获取所有导航列表（包括未启用），支持位置和分页
// @Tags 导航管理
// @Accept json
// @Produce json
// @Param position query string false "导航位置"
// @Param page query int false "页码，默认1"
// @Param page_size query int false "每页数量，默认10"
// @Success 200 {object} response.Response{data=navigation.NavigationListResponse}
// @Router /api/v1/admin/navigation/list [get]
func (h *NavigationHandler) AdminList(c *gin.Context) {
	// 获取查询参数
	position := c.Query("position")

	// 获取分页参数
	page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
	pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10"))

	// 参数校验
	if page <= 0 {
		page = 1
	}
	if pageSize <= 0 {
		pageSize = 10
	}

	// 调用服务获取导航列表（不限制状态）
	result, err := h.service.ListNavigations(c.Request.Context(), position, page, pageSize, nil)
	if err != nil {
		c.Error(err)
		return
	}

	h.response.Success(c, result)
}
